package module

// 路径定义
const (
	CREATE_POLICY_PATH   = "/api/v1/policy"      //创建策略 POST
	DELETE_POLICY_PATH   = "/api/v1/policy"      //删除策略 DELETE
	PUT_POLICY_PATH      = "/api/v1/policy"      //编辑策略 PUT
	GET_POLICY_PATH      = "/api/v1/policy/list" //获取策略列表 GET
	GET_MORE_POLICY_PATH = "/api/v1/policy/get"  //查询详细策略 GET
)
const (
	HOST = ":8080"
)

// ////////////////////创建策略///////////////////
// 创建策略的请求类型
type CreatePolicyRequest struct {
	// TODO: 手动校验必填字段: Name, Protocol, ListenInterface, ListenPort, ProxyAddress, ProxyPort, ForwardInterface, ForwardAddress, AccessControl(非空), VsysId
	Name             string   `json:"name"`
	Description      string   `json:"description,omitempty"`
	Protocol         string   `json:"protocol"`
	ListenInterface  string   `json:"listenInterface"`
	ListenPort       int      `json:"listenPort"`
	ProxyAddress     string   `json:"proxyAddress"`
	ProxyPort        int      `json:"proxyPort"`
	ForwardInterface string   `json:"forwardInterface"`
	ForwardAddress   string   `json:"forwardAddress"`
	ForwardPort      int      `json:"forwardPort,omitempty"`
	AccessControl    []string `json:"accessControl"`
	VsysId           int      `json:"vsysId"`
}

// 创建策略的响应类型
type CreatePolicyResponse struct {
	Code    int    `json:"code"`
	Message string `json:"message"`
}

// //////////////////删除策略///////////////////////
// 删除策略的请求类型
type DeletePolicyRequest struct {
	// TODO: 手动校验 Ids 非空
	Ids []int `json:"ids"` // 整数数组
}

// 删除策略的响应类型
type DeletePolicyResponse struct {
	Code    int    `json:"code"`
	Message string `json:"message"`
}

//////////////////编辑策略///////////////////////

// 编辑策略的请求体类型
type UpdatePolicyRequest struct {
	Id int `json:"id"` // 策略id
	// TODO: 手动校验与 CreatePolicyRequest 相同的必填字段规则
	Name             string   `json:"name"`
	Description      string   `json:"description,omitempty"`
	Protocol         string   `json:"protocol"`
	ListenInterface  string   `json:"listenInterface"`
	ListenPort       int      `json:"listenPort"`
	ProxyAddress     string   `json:"proxyAddress"`
	ProxyPort        int      `json:"proxyPort"`
	ForwardInterface string   `json:"forwardInterface"`
	ForwardAddress   string   `json:"forwardAddress"`
	ForwardPort      int      `json:"forwardPort,omitempty"`
	AccessControl    []string `json:"accessControl"`
	VsysId           int      `json:"vsysId"`
}

// 编辑策略的响应体类型
type UpdatePolicyResponse struct {
	Code    int    `json:"code"`
	Message string `json:"message"`
}

//////////////////获取策略列表/////////////////////

// 策略属性结构体
type ListPolicyListItem struct {
	ID               int      `json:"id"`
	Name             string   `json:"name" binding:"required"`
	Description      string   `json:"description,omitempty"`
	Protocol         string   `json:"protocol" binding:"required"`
	ListenInterface  string   `json:"listenInterface" binding:"required"`
	ListenPort       int      `json:"listenPort" binding:"required"`
	ProxyAddress     string   `json:"proxyAddress" binding:"required"`
	ProxyPort        int      `json:"proxyPort" binding:"required"`
	ForwardInterface string   `json:"forwardInterface" binding:"required"`
	ForwardAddress   string   `json:"forwardAddress" binding:"required"`
	ForwardPort      int      `json:"forwardPort,omitempty"`
	AccessControl    []string `json:"accessControl" binding:"required"`
	VsysId           int      `json:"vsysId" binding:"required"`
	CreatedAt        string   `json:"createdAt"`
	UpdatedAt        string   `json:"updatedAt"`
}

// 策略列表分页数据结构体
type ListPolicyData struct {
	List        []ListPolicyListItem `json:"list"`
	CurrentPage int                  `json:"currentPage"`
	Total       int                  `json:"total"`
}

// 查询策略列表的请求类型
type ListPolicyRequest struct {
	// TODO: 手动校验 PageSize, PageNum, VsysId > 0
	PageSize int    `form:"pageSize"` // 每页数量，默认20
	PageNum  int    `form:"pageNum"`  // 页码，默认1
	VsysId   int    `form:"vsysId"`   // 虚拟系统id
	Name     string `form:"name"`     // 策略名称，支持模糊查询，可选
}

// 查询策略列表的响应类型
type ListPolicyResponse struct {
	Code    int            `json:"code"`
	Message string         `json:"message"`
	Data    ListPolicyData `json:"data"`
}

//////////////////查询详细策略/////////////////////

// 查询策略详情请求类型
type GetPolicyRequest struct {
	// TODO: 手动校验 Id > 0
	Id int `form:"id"` // 策略id
}

// 查询单条策略详情的响应类型
type GetPolicyResponse struct {
	Code    int                `json:"code"`
	Message string             `json:"message"`
	Data    ListPolicyListItem `json:"data"`
}
